package io.renren.wechat.support;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * @author dmcp@qq.com
 * @since 2021/12/21 11:50
 */
public abstract class RedirectUriUtils {
    private static final Logger LOGGER = LoggerFactory.getLogger(RedirectUriUtils.class);

    public static String buildH5IndexUri(String baseUrl, String corpId, String userType,
                                         String userId, String openId, String agentId, String suitId) {
        String url = baseUrl;
        List<String> params = new ArrayList<>();

        if (StringUtils.isNotBlank(corpId)) {
            params.add("corpId=" + corpId);
        }
        if (StringUtils.isNotBlank(userType)) {
            params.add("userType=" + userType);
        }
        if (StringUtils.isNotBlank(userId)) {
            params.add("userId=" + userId);
        }
        if (StringUtils.isNotBlank(openId)) {
            params.add("openId=" + openId);
        }
        if (StringUtils.isNotBlank(agentId)) {
            params.add("agentId=" + agentId);
        }
        if (StringUtils.isNotBlank(suitId)) {
            params.add("suitId=" + suitId);
        }

        if (CollectionUtils.isNotEmpty(params)) {
            url = url.concat("?").concat(StringUtils.join(params, "&"));
        }

        return url;
    }

    public static String buildH5SubscribeUri(String baseUrl, String corpId, String userType,
                                             String userId, String openId, String agentId,
                                             HttpServletRequest request) {
        final String id = request.getParameter("id");
        final String meetingRoomId = request.getParameter("meetingRoomId");

        String url = baseUrl;
        List<String> params = new ArrayList<>();

        if (StringUtils.isNotBlank(corpId)) {
            params.add("corpId=" + corpId);
        }
        if (StringUtils.isNotBlank(userType)) {
            params.add("userType=" + userType);
        }
        if (StringUtils.isNotBlank(userId)) {
            params.add("userId=" + userId);
        }
        if (StringUtils.isNotBlank(openId)) {
            params.add("openId=" + openId);
        }
        if (StringUtils.isNotBlank(agentId)) {
            params.add("agentId=" + agentId);
        }
        if (StringUtils.isNotBlank(id)) {
            params.add("id=" + id);
        }
        if (StringUtils.isNotBlank(meetingRoomId)) {
            params.add("meetingRoomId=" + meetingRoomId);
        }

        if (CollectionUtils.isNotEmpty(params)) {
            url = url.concat("?").concat(StringUtils.join(params, "&"));
        }

        return url;
    }

    /**
     * https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=%s#wechat_redirect
     * <p>
     * 参数	            必须	        说明
     * appid	        是	        第三方应用id（即ww或wx开头的suite_id）。注意与企业的网页授权登录不同
     * redirect_uri	    是	        授权后重定向的回调链接地址，请使用urlencode对链接进行处理 ，注意域名需要设置为第三方应用的可信域名
     * response_type	是	        返回类型，此时固定为：code
     * scope	        是	        应用授权作用域:
     * snsapi_base        静默授权，可获取成员的基础信息（UserId与DeviceId）；
     * snsapi_userinfo    静默授权，可获取成员的详细信息，但不包含头像、二维码等敏感信息；
     * snsapi_privateinfo 手动授权，可获取成员的详细信息，包含头像、二维码等敏感信息。
     * state	        否	        重定向后会带上state参数，企业可以填写a-zA-Z0-9的参数值，长度不可超过128个字节
     * #wechat_redirect	是	        固定内容
     *
     * @return redirect uri
     */
    public static String buildRedirectUri(String baseUrl, String wxAuthUrl, String suiteId,
                                          HttpServletRequest request) throws UnsupportedEncodingException {
        String responseType = "code";
        String scope = "snsapi_userinfo";
        String state = "123456";
        final String originalRedirectUrl = getRedirectUrl(baseUrl, request);
        LOGGER.info(">>>>>>>>>>>>>originalRedirectUrl: {}", originalRedirectUrl);
        String redirectUrl = URLEncoder.encode(originalRedirectUrl, StandardCharsets.UTF_8.name());

        return String.format(wxAuthUrl, suiteId, redirectUrl, responseType, scope, state);
    }


    /* 权限说明：使用snsapi_privateinfo的scope时，第三方应用必须有’成员敏感信息授权’的权限。 */
    public static String buildFullRedirectUri(String redirectUri, String wxAuthUrl,
                                              String agentId, String suiteId) throws UnsupportedEncodingException {
        String responseType = "code";
        // snsapi_base：静默授权，可获取成员的基础信息（UserId与DeviceId）；
        // snsapi_userinfo：静默授权，可获取成员的详细信息，但不包含手机、邮箱等敏感信息；
        // snsapi_privateinfo：手动授权，可获取成员的详细信息，包含手机、邮箱等敏感信息。
        String scope = "snsapi_userinfo";
        String state = "1234567890";
        String redirectUrl = URLEncoder.encode(redirectUri, StandardCharsets.UTF_8.name());

        return String.format(wxAuthUrl, suiteId, redirectUrl, responseType, scope, agentId, state);
    }


    public static String getRedirectUrl(String baseUrl, HttpServletRequest request) {
        String url = baseUrl;
        List<String> params = new ArrayList<>();

        final String meetingRoomId = request.getParameter("meetingRoomId");

        if (StringUtils.isNotBlank(request.getParameter("type"))) {
            params.add("type=" + request.getParameter("type"));
        }
        if (StringUtils.isNotBlank(request.getParameter("agentId"))) {
            params.add("agentId=" + request.getParameter("agentId"));
        }
        if (StringUtils.isNotBlank(request.getParameter("seatCode"))) {
            params.add("seatCode=" + request.getParameter("seatCode"));
        }
        if (StringUtils.isNotBlank(meetingRoomId)) {
            params.add("meetingRoomId=" + meetingRoomId);
        }

        if (CollectionUtils.isNotEmpty(params)) {
            url = url.concat("?").concat(StringUtils.join(params, "&"));
        }

        return url;
    }
}
